//
// Created by cls on 2024/11/2.
//

#include "demo1.h"
#include "log.h"

void fun(int* n, int arr[], int y)
{

    printf("y = %d \n",y);

    int j = 0 ;

    for (int i = 0; i < *n; ++i) {

        printf("arr[%d] = %d \n",i,arr[i]);

        if (arr[i] != y)
        {
            arr[j++] = arr[i]; // 将非y元素移到前面
        }
    }
    *n = j;  // 更新数组大小
}

void PrintHello(char* name)
{
    // printf("name is %s \n",name);
    ALOGD("name is %s \n",name);

    int val1 = 42;
    LOG_I("This is a log message with value %d\n", val1);

    int val = 33;
    const char *module = "MyModule";
    LOG_D(module,"This is a log message with value %d\n",val);
}

int Add(int a,int b)
{
    int c = a + b;
    printf("result is %d\n",c);
}

// 一个函数，接受一个整数和一个回调函数
void process(int value1, int value2,ptr1 callback) {
    // 对值进行某种处理
    value1 *= 2;
    value2 *= 2;
    // 调用回调函数
    callback(value1,value2);
}

void demo1107()
{
    int a = 10;
    int b = 20;
    int c = 30;

    int* arr[3] = {&a,&b,&c};

    for (int i = 0; i < 3; i++) {
        printf("%d ",*arr[i]);
    }

    printf("\n");

}

void demo1108()
{
    int arr1[] = {1,2,3,4,5};
    int arr2[] = {2,3,4,5,6};
    int arr3[] = {3,4,5,6,7};

    // 定义一个存放数组的指针
    int parr[] =  {arr1,arr2,arr3};
    printf("%p \n",arr1);
    printf("%d \n",arr1[1]);
    printf("%p \n",arr2);
    printf("%p \n",arr3);
    printf("%p \n",parr);
    printf("%p \n",parr[1]);
}

void demo1109()
{
    int* p = NULL; // p是整形指针 -- 指向整形的指针 -- 存放整形的地址
    char* pc = NULL; // pc是字符指针 -- 指向字符的指针 -- 存放字符的地址
    // 数组指针 -- 是不是指向数组的指针？ -- 存放数组的地址
    int arr[10] = {0,6,0};
    printf("数组首元素地址 %p \n",arr);
    printf("数组首元素地址 %p \n",&arr[0]);
    printf("整个数组的地址 %p \n",&arr);
    // 如何存放数组地址呢？ &arr 指向整个数组的指针
    // 想让 parr 指向整个数组（而不仅仅是第一个元素），你需要声明 parr 为 int (*)[10] 类型的指针。
    int (*parr)[10] = &arr;
    printf("parr %p\n",parr);
    printf("Second element: %d\n", (*parr)[1]);  // 通过数组指针访问第二个元素

    char pch[10] = {'w','c'};
    char (*pch1)[10] = &pch;
    printf("Second element: %c\n", (*pch1)[1]);  // 通过数组指针访问第二个元素

    // 定义一个字符型指针数组
    char* pc1[10];
    // 字符指针的地址又该如何存放呢？
    char* (*pa)[10] = &pc1;

    // ----------------

    int arr5[10] = {1,2,3,4,5,6,7,8,9,10};

    int (*arr5_2)[10] = &arr5;

    for (int i = 0; i < 10; i++) {

        printf("%d ",(*arr5_2)[i]); // 不太容易理解
    }

    printf("\n");

    // 第二种写法
    for (int i = 0; i < 10; i++) {

        // *arr5_2 == arr5 ==> 首元素的地址 ==》 arr5_2+i 即表示指针移动
        printf("%d ",*(*arr5_2+i));
    }

    printf("\n");
};

void print2(int (*p)[5],int x,int y)
{
    // 遍历二维数组
    for (int i = 0; i < x; i++) {

        for (int j = 0; j < y; j++) {

            // p + i 给出了第 i 行的地址
            // *(p + i) 访问第 i 行，得到该行的起始地址
            // *(p + i) + j 访问该行的第 j 个元素
            // 打印出几行几列的元素
            printf("%d ",*(*(p+i) + j));
        }

        printf("\n");
    }
};

void print3(int (*p)[5],int x,int y)
{
    // 遍历二维数组
    for (int i = 0; i < x; i++) {

        for (int j = 0; j < y; j++) {

            // p + i 给出了第 i 行的地址
            // *(p + i) 访问第 i 行，得到该行的起始地址
            // *(p + i) + j 访问该行的第 j 个元素
            // 打印出几行几列的元素
            printf("%d ",p[i][j]);
        }

        printf("\n");
    }
};

void print1204(int n)
{

    /**
         *
        ***
       *****
      *******
     *********
      *******
       *****
        ***
         *
     */

    // 上半部分
    for (int i = 0; i < n; i++)
    {

        // 打印前面空格
        for (int j = 0; j < n - i - 1; j++)
        {
            printf(" ");
        }
        // 打印*
        for (int j = 0; j < 2 * i + 1; j++)
        {
            printf("*");
        }
        // 换行
        printf("\n");
    }

    // 下半部分（箭头的底部）
    for (int i = n - 2; i >= 0; i--)
    {
        // 从 n-2 到 0
        // 打印前面的空格
        for (int j = 0; j < n - i - 1; j++)
        {
            // 计算空格数量
            printf(" ");
        }
        // 打印星号
        for (int j = 0; j < 2 * i + 1; j++)
        {
            // 星号数量
            printf("*");
        }
        // 换行
        printf("\n");

    }


}

